home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / ModemLink / Source / ModemLinkDev.c < prev    next >
C/C++ Source or Header  |  1997-10-26  |  3KB  |  110 lines

  1. /*
  2. ** NAME: ModemLinkDev.c
  3. ** DESC: This file contains the init and shut down routines for the device.
  4. **       When the device is opened using OpenDevice() the SAS/C device code
  5. **       will call __UserDevInit().  When the device is closed it will then
  6. **       make a call to __UserDevCleanup.  These are obviously only used in
  7. **       the device version of the modemlink package.
  8. **
  9. ** AUTHOR:        DATE:       DESCRIPTION:
  10. ** ~~~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  11. ** Mike Veroukis  06 Apr 1997 Created
  12. ** Mike Veroukis  26 Oct 1997 Found bug in __UserDevInit.  It wasn't creating
  13. **                            the ModemLink semaphore used to lock out other
  14. **                            instances of the same Unit number.
  15. */
  16.  
  17.  
  18. #include <exec/execbase.h>
  19. #include <exec/io.h>
  20. #include <exec/memory.h>
  21. #include <exec/semaphores.h>
  22. #include <proto/exec.h>
  23. #include <proto/intuition.h>
  24.  
  25. #include "Link.h"
  26.  
  27. extern struct ExecBase *SysBase;
  28.  
  29.  
  30. int  __saveds __asm __UserDevInit(register __d0 long unit,
  31.                                    register __a0 struct IORequest *ior,
  32.                                    register __a6 struct Library *libbase)
  33. {
  34.   struct IOExtLink *LinkIO = (struct IOExtLink *)ior;
  35.   struct SignalSemaphore *DevSem;
  36.   char SemName[20];
  37.   int ReturnCode = 0;
  38.  
  39.   /*
  40.   ** can only run under 2.0 or greater
  41.   */
  42.   if (SysBase->LibNode.lib_Version < 36)
  43.     ReturnCode = 1;
  44.   else {
  45.     stcl_h(SemName, LinkIO->Unit);
  46.     strins(SemName, "ModemLink");
  47.  
  48.     Forbid();
  49.  
  50.     DevSem = FindSemaphore(SemName);
  51.     if (!DevSem) {
  52.       if (DevSem = AllocMem(sizeof(struct SignalSemaphore), MEMF_PUBLIC | MEMF_CLEAR)) {
  53.         InitSemaphore(DevSem);
  54.  
  55.         DevSem->ss_Link.ln_Pri = 0;
  56.         DevSem->ss_Link.ln_Name = AllocMem(strlen(SemName) + 1L, MEMF_PUBLIC | MEMF_CLEAR);
  57.         strcpy(DevSem->ss_Link.ln_Name, SemName);
  58.  
  59.         AddSemaphore(DevSem);
  60.         ObtainSemaphore(DevSem);
  61.       }
  62.       else {
  63.         Permit();
  64.         ReturnCode = 2;
  65.       }
  66.     }
  67.     else {
  68.       Permit();
  69.       ReturnCode = 3;
  70.     }
  71.  
  72.     Permit();
  73.  
  74.     if (!ReturnCode) {
  75.       LinkIO->LinkPortName[0] = 0;
  76.       LinkIO->LinkProcName[0] = 0;
  77.       LinkIO->Unit = unit;
  78.     }
  79.   }
  80.  
  81.   ior->io_Error = ReturnCode;
  82.   return ReturnCode;
  83. }
  84.  
  85. void __saveds __asm __UserDevCleanup(register __a0 struct IORequest *ior,
  86.                                      register __a6 struct Library *libbase)
  87. {
  88.   struct IOExtLink *LinkIO = (struct IOExtLink *)ior;
  89.   struct SignalSemaphore *DevSem;
  90.   char SemName[20];
  91.  
  92.   if (LinkIO->LinkProcName[0] && FindTask(LinkIO->LinkProcName))
  93.     ML_Terminate(LinkIO);
  94.  
  95.   stcl_h(SemName, LinkIO->Unit);
  96.   strins(SemName, "ModemLink");
  97.  
  98.   Forbid();
  99.  
  100.   if (DevSem = FindSemaphore(SemName)) {
  101.     RemSemaphore(DevSem);
  102.     ReleaseSemaphore(DevSem);
  103.     if (DevSem->ss_Link.ln_Name)
  104.       FreeMem(DevSem->ss_Link.ln_Name, strlen(DevSem->ss_Link.ln_Name) + 1L);
  105.     FreeMem(DevSem, sizeof(struct SignalSemaphore));
  106.   }
  107.  
  108.   Permit();
  109. }
  110.